/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package view;

import com.sun.lwuit.CheckBox;
import com.sun.lwuit.ComboBox;
import com.sun.lwuit.Form;
import com.sun.lwuit.Command;
import com.sun.lwuit.Component;
import com.sun.lwuit.Image;
import com.sun.lwuit.Label;
import com.sun.lwuit.TextArea;
import com.sun.lwuit.TextField;
import com.sun.lwuit.events.ActionEvent;
import com.sun.lwuit.events.ActionListener;
import com.sun.lwuit.events.FocusListener;
import com.sun.lwuit.events.SelectionListener;
import com.sun.lwuit.layouts.BoxLayout;
import com.sun.lwuit.list.DefaultListModel;
import com.sun.lwuit.plaf.Border;
import core.Browser;
import core.BrowserAction;
import core.MainOne;
import core.Settings;
import java.util.Vector;
import view.additional.CellItem;

/**
 *
 * @author Kvest
 */
public class OptionsForm extends Form implements ActionListener, FocusListener, BrowserAction
{
    public static final int SAVE_ID = 1;
    public static final int BACK_ID = 2;
    public static final int LOG_ID = 3;
    public static final int DELETE_ORDERS_ID = 4;
    public static final int CLEAR_RMS_ID = 5;
    public static final int CHANGE_ID = 6;

    private Command save;
    private Command back;
    private Command log; 
    private Command deleteOrders;
    private Command clearRMS;
    private Command change;
    private FormAction listener;

    private CheckBox autoEnter;
    private CheckBox switchOffMusic;
    private ComboBox voiceRington;
    private ComboBox newOrderMelody;
    private ComboBox yourOrderMelody;
    private ComboBox messageMelody;
    private TextField timeFixer;
    private CheckBox switchLight;
    private CheckBox showVirtualKeyboard;
    private CheckBox saveLogs;
    private TextField preordersUpdatePeriod;
    private TextField efirMusicReplayPeriod;
    private TextField maxArchivOrdersCount;
    private TextField textHeight;

    
    //Форма отображения выбора собственной мелодии
    private MelodySearchForm melodySearchForm;
    private Browser browser;
    private int searchIndex;
    private String path;

    public OptionsForm(FormAction listener)
    {
        super("Настройки");
        this.listener = listener;

        init();
    }

    public void focusGained(Component cmp)
    {
        if ((cmp == newOrderMelody && newOrderMelody.getSelectedIndex() == 1) ||
            (cmp == yourOrderMelody && yourOrderMelody.getSelectedIndex() == 1) ||
            (cmp == messageMelody && messageMelody.getSelectedIndex() == 1))
        {
            addCommand(change);
        }
    }

    public void focusLost(Component cmp)
    {
        removeCommand(change);
    }

    public void show()
    {
        Settings settings = Settings.getSettings();
        
        autoEnter.setSelected(settings.isAutoEnter());
        switchOffMusic.setSelected(settings.isSwitchOffMusic());
        voiceRington.setSelectedIndex(settings.getVoiceRington());
        newOrderMelody.setSelectedIndex(settings.getNewOrderMelodyIndex());
        yourOrderMelody.setSelectedIndex(settings.getYourOrderMelodyIndex());
        messageMelody.setSelectedIndex(settings.getMessageMelodyIndex());
        timeFixer.setText(Integer.toString(settings.getTimeFixer()));

        switchLight.setSelected(settings.isSwitchLight());
        showVirtualKeyboard.setSelected(settings.isShowVirtualKeyboard());
        saveLogs.setSelected(settings.isSaveLogs());
        preordersUpdatePeriod.setText(Integer.toString(settings.getPreordersUpdatePeriod()));
        efirMusicReplayPeriod.setText(Integer.toString(settings.getEfirMusicReplayPeriod()));
        maxArchivOrdersCount.setText(Integer.toString(settings.getMaxArchivOrdersCount()));
        textHeight.setText(Integer.toString(settings.getOrderTextHeight()));
                
        super.show();
    }

    private void init()
    {
        setLayout(new BoxLayout(BoxLayout.Y_AXIS));

        browser = new Browser(this);

        addCommandListener(this);

        back= new Command("Назад", BACK_ID);
        addCommand(back);

        log = new Command("Лог",LOG_ID);
        addCommand(log);

        clearRMS = new Command("Очистить RMS",CLEAR_RMS_ID);
        addCommand(clearRMS);

        deleteOrders = new Command("Отменить заказы",DELETE_ORDERS_ID);
        addCommand(deleteOrders);

        save = new Command("Сохранить", SAVE_ID);
        addCommand(save);

        change = new Command("Изменить",CHANGE_ID);

        //Автовход
        autoEnter = new CheckBox("Автовход");
        autoEnter.setSelectCommandText("");
        addComponent(autoEnter);

        addComponent(new Label("Настройки мелодий:"));

        //Отключение всего звука
        switchOffMusic = new CheckBox("Отключить звук");
        switchOffMusic.setSelectCommandText("");
        addComponent(switchOffMusic);

        //Подсказка голосом или мелодией
        addComponent(new Label("Звуки"));
        voiceRington = new ComboBox(new String[]{"Стандартные(midi)","Стандартные(amr)","Голосовое сообщение"});
        voiceRington.setSelectCommandText("");
        addComponent(voiceRington);

        SelectionListener sel_listener = new SelectionListener()
        {
            public void selectionChanged(int oldSelected, int newSelected)
            {
                removeCommand(change);
                if (getFocused() != null && (getFocused() instanceof ComboBox) && ((ComboBox)getFocused()).getSelectedIndex() == 1)
                {
                    addCommand(change);
                }
            }
        };

        //Настройки мелодии для нового заказа
        String[] arr = new String[3];
	arr[0] = "Стандартная мелодия";
        String tmp = Settings.getSettings().getNewOrderMediaFile();
	if (tmp.equals(""))
	{
            arr[1] = "<Своя мелодия>";
	}
            else
	{
            arr[1] = tmp.substring(tmp.lastIndexOf('/')+1);
	}
	arr[2] = "Нет мелодии";
        addComponent(new Label("Новый заказ"));
	newOrderMelody = new ComboBox(arr);
        newOrderMelody.setSelectCommandText("");
        newOrderMelody.addSelectionListener(sel_listener);
        addComponent(newOrderMelody);
        
         //Настройки мелодии на получение заказа
        tmp = Settings.getSettings().getYourOrderMediaFile();
	if (tmp.equals(""))
	{
             arr[1] = "<Своя мелодия>";
	}
	else
	{
            arr[1] = tmp.substring(tmp.lastIndexOf('/')+1);
	}
        addComponent(new Label("Получение заказа"));
	yourOrderMelody = new ComboBox(arr);
        yourOrderMelody.setSelectCommandText("");
        yourOrderMelody.addSelectionListener(sel_listener);
        addComponent(yourOrderMelody);
        
	//Настройки мелодии на получение сообщения
        tmp = Settings.getSettings().getMessageMediaFile();
	if (tmp.equals(""))
	{
            arr[1] = "<Своя мелодия>";
	}
	else
	{
            arr[1] = tmp.substring(tmp.lastIndexOf('/')+1);
	}
        addComponent(new Label("Текстовое сообщение"));
	messageMelody = new ComboBox(arr);
        messageMelody.setSelectCommandText("");
        messageMelody.addSelectionListener(sel_listener);
        addComponent(messageMelody);

        addComponent(new Label("Поправка времени, мин"));
        timeFixer = new TextField();
        timeFixer.setSelectCommandText("");
        timeFixer.setConstraint(TextArea.NUMERIC);
        timeFixer.setInputModeOrder(new String[]{"123"});
        addComponent(timeFixer);

        //включать ли подсветку экрана
        switchLight = new CheckBox("Подсветка всегда");
        switchLight.setSelectCommandText("");
        addComponent(switchLight);
        
        //Отображать ли виртуальную клавиатуру
        showVirtualKeyboard =  new CheckBox("Использовать софт-клавиатуру");
        showVirtualKeyboard.setSelectCommandText("");
        addComponent(showVirtualKeyboard);

        //Сохранять лог?
        saveLogs = new CheckBox("Сохранять лог");
        saveLogs.setSelectCommandText("");
        addComponent(saveLogs);

        preordersUpdatePeriod = new TextField(); 
        preordersUpdatePeriod.setSelectCommandText("");
        preordersUpdatePeriod.setInputModeOrder(new String[]{"123"});
        preordersUpdatePeriod.setConstraint(TextArea.NUMERIC);
        int functionMenuType = ViewManager.getViewManager().getFunctionMenuType();
        if (functionMenuType == FunctionMenu.CHERNOVTSI_TYPE || functionMenuType == FunctionMenu.KIROVOGRAD_TYPE)
        {
            TextArea label = new TextArea("Период автоматического обновления предварительных, мин", 1, 30);
            label.getStyle().setBorder(Border.createEmpty());
            label.setEditable(false);
            label.setFocusable(false);
            label.setGrowByContent(true);
            addComponent(label);
        
            addComponent(preordersUpdatePeriod);
        }
        
        efirMusicReplayPeriod = new TextField(); 
        efirMusicReplayPeriod.setSelectCommandText("");
        efirMusicReplayPeriod.setInputModeOrder(new String[]{"123"});
        efirMusicReplayPeriod.setConstraint(TextArea.NUMERIC); 
        if (functionMenuType == FunctionMenu.CHERNOVTSI_TYPE)
        {
            TextArea label = new TextArea("Повтор сигнала в эфире каждые, сек", 1, 30);
            label.getStyle().setBorder(Border.createEmpty());
            label.setEditable(false);
            label.setFocusable(false);
            label.setGrowByContent(true);
            addComponent(label);
        
            addComponent(efirMusicReplayPeriod);
        }
        
        addComponent(new Label("Количество заказов в архиве"));
        maxArchivOrdersCount = new TextField();
        maxArchivOrdersCount.setSelectCommandText("");
        maxArchivOrdersCount.setInputModeOrder(new String[]{"123"});
        maxArchivOrdersCount.setConstraint(TextArea.NUMERIC); 
        addComponent(maxArchivOrdersCount);
        
        
        textHeight = new TextField();
        textHeight.setSelectCommandText("");
        textHeight.setInputModeOrder(new String[]{"123"});
        textHeight.setConstraint(TextArea.NUMERIC);
        if (functionMenuType == FunctionMenu.CHERNOVTSI_TYPE) {
            addComponent(new Label("Высота шрифта"));
            addComponent(textHeight);
        }
        
        //Количества свободного места для сохранения заказов
        Label rms = new Label("RMS: " + MainOne.getMainOne().getOrderManager().getRMSInfo());
        rms.setFocusable(true);
        addComponent(rms);
        
        //Версия
        Label version = new Label("Версия: " + MainOne.getMainOne().getAppProperty("MIDlet-Version"));
        version.setFocusable(true);
        addComponent(version);

        addComponent(new Label(" "));
        
        addFocusListener(this);
    }

    public void actionPerformed(ActionEvent evt)
    {
        Command cmd = evt.getCommand();
        if (cmd.getId() == SAVE_ID)
        {
            saveAction();
        }
        if (cmd.getId() == CHANGE_ID)
        {
            changeMelody();
            return;
        }
        if (listener != null)
        {
            listener.commandAction(cmd.getId());
        }
    }

    private void changeMelody()
    {
        Component item = getFocused();
        if (item == newOrderMelody)
        {
            searchIndex = 0;
            path = Settings.getSettings().getNewOrderMediaFile();
        }
        if (item==yourOrderMelody)
        {
            searchIndex = 1;
            path = Settings.getSettings().getYourOrderMediaFile();
        }
        if (item==messageMelody)
        {
            searchIndex = 2;
            path = Settings.getSettings().getMessageMediaFile();
        }
        
        showMelodySearchForm();
    }

    private void saveAction()
    {
        Settings settings = Settings.getSettings();

        settings.setAutoEnter(autoEnter.isSelected());
        settings.setSwitchOffMusic(switchOffMusic.isSelected());
        settings.setVoiceRington(voiceRington.getSelectedIndex());
        settings.setNewOrderMelodyIndex(newOrderMelody.getSelectedIndex());
        settings.setYourOrderMelodyIndex(yourOrderMelody.getSelectedIndex());
        settings.setMessageMelodyIndex(messageMelody.getSelectedIndex());
        try
        {
            settings.setTimeFixer(Integer.parseInt(timeFixer.getText()));
        }catch(Exception ex){}
        settings.setSaveLogs(saveLogs.isSelected());
        settings.setSwitchLight(switchLight.isSelected());
        settings.setShowVirtualKeyboard(showVirtualKeyboard.isSelected());
        settings.setPreordersUpdatePeriod(Integer.parseInt(preordersUpdatePeriod.getText()));
        settings.setEfirMusicReplayPeriod(Integer.parseInt(efirMusicReplayPeriod.getText()));
        settings.setMaxArchivOrdersCount(Integer.parseInt(maxArchivOrdersCount.getText()));
        settings.setOrderTextHeight(Integer.parseInt(textHeight.getText()));
    }

    private void showMelodySearchForm()
    {
        if (melodySearchForm == null)
	{
            melodySearchForm = new MelodySearchForm(new FormAction()
            {
                public void commandAction(int commandID)
                {
                    if (commandID == MelodySearchForm.OK_ID)
                    {
                        processMelodySearchOk();
                    }
                    else if (commandID == MelodySearchForm.CANCEL_ID)
                    {
                        OptionsForm.super.show();
                    }
                }
            });
	}

	//Делавем запрос на новые данные
	if (path.equals(""))
	{
            browser.getRoots();
	}
	else
	{
            path = path.substring(0,path.lastIndexOf('/')+1);
            browser.getFolders("file:///"+path);
	}

	//Выводим список на экран
	melodySearchForm.show();
    }

    public void browserAction(int code,Vector folders,Vector files)
    {
        if (melodySearchForm!=null)
	{
            if (code==1)
            {
                //Удаляем предыдущие данные
		melodySearchForm.clear();
		Image rootImage = null;
		try
		{
                    rootImage = Image.createImage("/root.png");
		}catch(Exception e){}
		//Добавляем список корней
		for (int i=0;i<folders.size();i++)
                {
                    melodySearchForm.add(new CellItem(i,(String)folders.elementAt(i),rootImage));
		}
            }
            if (code==2)
            {
                //Удаляем предыдущие данные
		melodySearchForm.clear();
		Image folderImage = null;
		Image fileImage = null;
		try
		{
                    fileImage = Image.createImage("/file.png");
                    folderImage = Image.createImage("/folder.png");
		}catch(Exception e){}
		//Добавляем список папок
		melodySearchForm.add(new CellItem(0,"..",folderImage));
		for (int i=0;i<folders.size();i++)
		{
                    melodySearchForm.add(new CellItem(i + 1,(String)folders.elementAt(i),folderImage));
		}
		String fileName;
		for (int i=0;i<files.size();i++)
		{
                    fileName = (String)files.elementAt(i);
                    if (fileName.endsWith(".mp3")||fileName.endsWith(".mid")||fileName.endsWith(".wav"))  //Если это файлы с музыкой
                    {
                        melodySearchForm.add(new CellItem(i + 1,fileName,fileImage));
                    }
		}
            }
        }
    }

    private void processMelodySearchOk()
    {
   
        CellItem item = melodySearchForm.getSelectedItem();
        if (item == null)
        {
            return;
        }
	String temp = item.getText();
	if (temp.equals(".."))
	{
            path = "/" + path;
            path = path.substring(0,path.lastIndexOf('/')-1);
            path = path.substring(0,path.lastIndexOf('/')+1);
            if (path.equals("/"))
            {
		path = "";
		browser.getRoots();
            }
            else
            {
                path = path.substring(1,path.length()); 
		browser.getFolders("file:///"+path);
            }
            return;
	}
	if (temp.lastIndexOf('/')==(temp.length()-1))  //Если это папка - заходим в нее
	{
            path += temp; 
            browser.getFolders("file:///"+path);
	}
	else                                           //Если файл - ставим на меодию
	{
            path += temp; 
            applyUserMelody();
	}
    }

    private void applyUserMelody()
    {
 System.out.println("searchIndex=" + searchIndex);
        switch (searchIndex)
        {
            case 0: setNewOrderMediaFile(path); break;
            case 1: setYourOrderMediaFile(path); break;
            case 2: setMessageMediaFile(path); break;
        }

	OptionsForm.super.show();
    }

    private void setMessageMediaFile(String value)
    {
        Settings.getSettings().setMessageMediaFile(value);

        String[] arr = new String[3];
	arr[0] = "Стандартная мелодия";
	if (value.equals(""))
	{
            arr[1] = "<Своя мелодия>";
	}
        else
	{
            arr[1] = value.substring(value.lastIndexOf('/')+1);
	}
	arr[2] = "Нет мелодии";
        messageMelody.setModel(new DefaultListModel(arr));
        messageMelody.setSelectedIndex(1);
    }

    private void setYourOrderMediaFile(String value)
    {
        Settings.getSettings().setYourOrderMediaFile(value);

        String[] arr = new String[3];
	arr[0] = "Стандартная мелодия";
	if (value.equals(""))
	{
            arr[1] = "<Своя мелодия>";
	}
            else
	{
            arr[1] = value.substring(value.lastIndexOf('/')+1);
	}
	arr[2] = "Нет мелодии";
        yourOrderMelody.setModel(new DefaultListModel(arr));
        yourOrderMelody.setSelectedIndex(1);
    }

    private void setNewOrderMediaFile(String value)
    {
        Settings.getSettings().setNewOrderMediaFile(value);

        String[] arr = new String[3];
	arr[0] = "Стандартная мелодия";
	if (value.equals(""))
	{
            arr[1] = "<Своя мелодия>";
	}
            else
	{
            arr[1] = value.substring(value.lastIndexOf('/')+1);
	}
	arr[2] = "Нет мелодии";
        newOrderMelody.setModel(new DefaultListModel(arr));
        newOrderMelody.setSelectedIndex(1);
    }
}
